use tantivy::{ collector::TopDocs, doc, query::QueryParser, schema::{ Schema, TEXT }, Index };

fn main() -> tantivy::Result<()> {
    // 创建一个模式构建器
    let mut schema_builder = Schema::builder();
    // 添加字段到模式
    let title = schema_builder.add_text_field("title", TEXT);
    let body = schema_builder.add_text_field("body", TEXT);

    // 构建模式
    let schema = schema_builder.build();

    // 为模式创建索引
    let index = Index::create_in_ram(schema.clone());
    // 在上面的例子中，我们使用了内存索引。
    // 在实际应用中，你可能需要将索引持久化到磁盘上。这可以通过将索引创建在磁盘上的特定目录来实现：
    // let index_path = "path/to/your/index/directory";
    // let index = Index::create_in_dir(index_path, schema)?;

    // 创建索引的写入器
    let mut index_writer = index.writer(50_000_000)?;

    // 添加文档到索引
    let _ = index_writer.add_document(
        doc!(
        title => "The Old Man and the Sea",
        body => "He was an old man who fished alone in a skiff in the Gulf Stream..."
    ));

    // 提交更改到索引
    index_writer.commit()?;

    // 创建一个查询解析器，指定可以搜索的字段
    let query_parser: QueryParser = QueryParser::for_index(&index, vec![title, body]);

    // 解析查询（用户输入）
    let query = query_parser.parse_query("old man")?;

    // 创建一个搜索器
    let searcher = index.reader()?.searcher();

    // 执行搜索，获取前10个相关的文档
    let top_docs = searcher.search(&query, &TopDocs::with_limit(10))?;

    // 遍历搜索结果
    for (score, doc_address) in top_docs {
        let retrieved_doc = searcher.doc(doc_address)?;
        println!("Document score: {}", score);
        println!("Document: {:?}", retrieved_doc);
    }

    Ok(())
}
